iT邦幫忙

2026 iThome 鐵人賽

0
AI Engineering

Java × AI:30天打造智慧健康助理系列 第 30 篇

智慧健康助理成果展示、完整測試與開發心得

  • 分享至 

  • xImage
  •  

Day 30|智慧健康助理成果展示、完整測試與開發心得

還記得 Day 1 的時候,我替這個系列取了名字:

Java × AI:30 天打造智慧健康助理

當時的想法其實很簡單。

我希望透過這次鐵人賽,從 Java 和 Spring Boot 的基礎開始學習,一步一步做出一個可以記錄健康資料,甚至能夠結合 AI 的小專案。

一開始只是想完成 BMI 計算功能。

後來慢慢加入飲水紀錄、睡眠紀錄、資料庫、AI 健康摘要、多輪對話,最後甚至做出了可以在瀏覽器操作的聊天網頁。

雖然這個專案距離真正可以公開使用的健康管理系統還有一段距離,但對我來說,已經是一次很完整的學習經驗。

今天是整個系列的最後一篇文章。

所以不打算再加入太多新功能,而是想好好整理這 30 天完成的內容,回顧整個專案的架構,並且進行一次完整的功能測試。

最後也想分享這段時間遇到的問題,以及我從這次挑戰中學到的事情。


一、最初為什麼想做智慧健康助理?

在開始這個系列之前,我對 Java 的理解主要還停留在程式語言本身。

例如:

public class Main {

    public static void main(String[] args) {

        System.out.println("Hello World!");

    }
}

我知道 Java 可以寫程式,也知道它經常被用在後端開發。

但如果要我回答:

「Java 到底要怎麼做成一個可以使用的應用程式?」

其實我沒有那麼清楚。

像是:

  • 前端要怎麼把資料傳給 Java?
  • Spring Boot 到底在做什麼?
  • API 和一般 Java Method 有什麼不同?
  • 使用者輸入的資料要怎麼保存?
  • 資料庫要怎麼和 Java 連接?
  • Java 又要怎麼呼叫 AI?

這些問題在一開始都讓我有點困惑。

所以我希望透過一個具體的專案,把這些概念串在一起。

而健康管理是一個相對容易理解的主題。

像是:

今天喝了多少水?
昨天睡了幾個小時?
我的 BMI 是多少?

這些都是生活中常見的問題。

如果能夠將這些資料記錄下來,再透過 AI 整理成自然語言摘要,感覺就能做出一個有實際應用情境的小系統。

於是,這次的智慧健康助理專案就開始了。


Part 1|回顧 30 天的開發歷程

二、30 天到底做了哪些事情?

回頭看這 30 天,我覺得最有趣的地方是:

每一天學習的內容其實都不算特別複雜。

但當這些功能慢慢累積起來,就變成了一個完整的專案。

以下是這次鐵人賽的開發歷程。

天數 主題 主要學習內容
Day 1 專案動機 為什麼想使用 Java 與 AI 打造健康助理
Day 2 需求規劃 確認健康助理需要哪些功能
Day 3 系統架構 認識前端、後端、資料庫與 AI
Day 4 建立專案 使用 Spring Initializr 建立 Spring Boot
Day 5 第一支 API 建立 Hello World REST API
Day 6 接收參數 使用 @RequestParam
Day 7 BMI 計算 使用 Java 實作 BMI 公式
Day 8 JSON 回傳 讓 API 回傳結構化資料
Day 9 POST API 使用 @RequestBody 接收 JSON
Day 10 分層設計 認識 Controller 與 Service
Day 11 資料驗證 使用 Jakarta Validation
Day 12 BMI 分類 加入成人 BMI 分類規則
Day 13 飲水紀錄 建立飲水紀錄 API
Day 14 H2 資料庫 認識資料庫與 JDBC
Day 15 保存飲水資料 將飲水紀錄寫入 H2
Day 16 飲水歷史 查詢指定日期與歷史紀錄
Day 17 飲水統計 計算七天飲水統計
Day 18 睡眠紀錄 建立睡眠紀錄 API
Day 19 睡眠統計 計算七天睡眠統計
Day 20 每日健康摘要 整合飲水與睡眠資料
Day 21 認識生成式 AI 學習 AI API 與 Prompt
Day 22 Java 呼叫 AI 使用 HttpClient 串接 AI API
Day 23 AI 健康摘要 讓 AI 整理每日健康紀錄
Day 24 AI 健康問答 建立健康知識問答 API
Day 25 AI 多輪對話 使用 conversationId 管理上下文
Day 26 保存 AI 對話 將聊天紀錄寫入資料庫
Day 27 聊天紀錄管理 查詢與刪除歷史對話
Day 28 聊天網頁 使用 HTML、CSS、JavaScript
Day 29 網頁功能整合 整合健康摘要與歷史對話
Day 30 成果整理 系統測試、架構回顧與學習心得

這樣整理之後才發現,原來我們已經完成這麼多內容!

如果要把這 30 天分成幾個階段,我會分成五個部分。

第一階段
Java 與 Spring Boot 基礎
Day 1~Day 6
        ↓
第二階段
健康計算與 API 設計
Day 7~Day 12
        ↓
第三階段
資料庫與健康紀錄
Day 13~Day 20
        ↓
第四階段
生成式 AI 整合
Day 21~Day 27
        ↓
第五階段
前端網頁與成果整合
Day 28~Day 30

從最初的 Hello World,到最後可以在瀏覽器操作的健康助理,每個階段都建立在前面學過的內容上。


Part 2|智慧健康助理的最終成果

三、目前完成了哪些功能?

先來整理這次專案最後完成的主要功能。

1. BMI 計算與分類

使用者可以輸入:

{
  "height": 1.65,
  "weight": 55
}

由 Java 計算 BMI:

BMI = 體重(公斤)÷ 身高(公尺)的平方

例如:

55 ÷ (1.65 × 1.65)

得到約:

20.20

接著依照台灣成人 BMI 分類,提供初步體位分類結果。

這裡要注意:

BMI 只是初步篩檢指標,不能單獨判斷一個人的整體健康狀況。

2. 飲水紀錄

使用者可以透過 API 新增飲水量。

例如:

POST /health/water

Request Body:

{
  "amount": 300
}

系統會將紀錄保存到 H2 Database。

也可以查詢:

GET /health/water

以及指定日期的飲水總量:

GET /health/water/date?date=2026-10-17

3. 飲水統計

除了單日紀錄,也可以查詢最近七天的飲水統計。

例如:

GET /health/water/statistics

由 Java 計算:

七天總飲水量
七天平均飲水量
最高紀錄
最低紀錄

這些數值都是由後端程式計算,而不是交給 AI 猜測。

4. 睡眠紀錄

使用者可以新增睡眠紀錄。

例如:

POST /health/sleep

Request Body:

{
  "sleepDate": "2026-10-17",
  "hours": 7.5
}

這裡的 sleepDate 代表醒來的日期。

系統會將資料保存到資料庫。

也可以查詢指定日期:

GET /health/sleep?date=2026-10-17

5. 睡眠統計

使用:

GET /health/sleep/statistics

可以取得最近七天的睡眠統計。

包含:

總睡眠時數
平均睡眠時數
最高睡眠紀錄
最低睡眠紀錄
有紀錄的天數
統計期間天數

這樣就不需要每次都手動計算。

6. 每日健康摘要

使用:

GET /health/summary?date=2026-10-17

可以將飲水與睡眠資料整合在一起。

例如:

{
  "date": "2026-10-17",
  "water": {
    "totalWater": 1500,
    "unit": "ml",
    "hasRecord": true
  },
  "sleep": {
    "totalHours": 7.5,
    "unit": "hours",
    "hasRecord": true
  }
}

這是我覺得整個專案很重要的一個轉折點。

因為在這之前,我們都是分別處理不同的健康紀錄。

到了這個階段,才開始把不同資料整合成同一個服務。

7. AI 每日健康摘要

使用:

GET /health/ai/summary?date=2026-10-17

系統會先查詢健康資料,再交給 AI 整理成自然語言。

例如:

{
  "date": "2026-10-17",
  "summary": "今天已記錄飲水量 1500 ml,睡眠時間 7.5 小時,可以持續記錄生活習慣,方便日後觀察變化。"
}

實際文字會依照 AI 模型產生的結果而不同。

這裡我們特別設計 Prompt,要求 AI:

  • 不編造不存在的健康數據。
  • 不把沒有紀錄當成數值為零。
  • 不提供疾病診斷或治療建議。
  • 不根據單一紀錄判斷使用者是否健康。

雖然 Prompt 無法百分之百保證 AI 回覆正確,但至少可以明確限制我們希望它完成的任務。

8. AI 健康問答與多輪對話

使用者可以詢問一般健康知識。

例如:

什麼是 BMI?

接著再問:

那它怎麼計算?

系統會透過:

conversationId

辨識同一段對話。

再將適當的歷史訊息提供給 AI,讓它可以理解前後文。

9. AI 聊天紀錄管理

聊天內容可以保存到 H2 Database。

也可以透過 API:

GET /health/ai/conversations

查詢歷史對話。

或是:

GET /health/ai/conversations/{id}

查看指定對話的完整內容。

另外也加入刪除對話的功能。

10. 智慧健康助理網頁

最後在 Day 28 和 Day 29,我們使用:

HTML
CSS
JavaScript

建立網頁介面。

使用者可以直接在瀏覽器:

http://localhost:8080/

操作主要功能。

包含:

每日健康摘要查詢
AI 健康摘要
AI 聊天
歷史對話列表
恢復之前的對話

這也是整個專案最有成就感的部分。

因為它終於不再只是一堆 API,而是有了實際可以操作的畫面。


Part 3|最終系統架構

四、完整架構圖

經過 30 天的開發,目前智慧健康助理的架構如下:

                  使用者
                     │
                     ▼
                Web Browser
                     │
          ┌──────────┴──────────┐
          │                     │
         HTML                  CSS
          │
          ▼
      JavaScript
          │
          ▼
       Fetch API
          │
          ▼
    ┌────────────────────────────┐
    │        Spring Boot         │
    │                            │
    │        Controller          │
    │            │               │
    │            ▼               │
    │         Service            │
    │            │               │
    │      ┌─────┴─────┐         │
    │      │           │         │
    │      ▼           ▼         │
    │  Repository   AIService    │
    │      │           │         │
    └──────┼───────────┼─────────┘
           │           │
           ▼           ▼
      H2 Database   OpenAI API

這張架構圖其實就是我們這 30 天學習的核心。

其中最重要的概念是:

不同層級負責不同的工作。


五、Controller 負責接收 HTTP Request

例如:

@RestController
@RequestMapping("/health")
public class HealthController {
    // API endpoints
}

Controller 主要負責:

接收 Request
取得參數
驗證輸入
呼叫 Service
回傳 Response

它不應該負責所有的業務邏輯。

這也是我們在 Day 10 開始學習分層設計的原因。


六、Service 負責業務邏輯

例如:

@Service
public class HealthSummaryService {
    // Business logic
}

Service 負責:

BMI 計算
飲水統計
睡眠統計
健康摘要整合
AI Prompt 建立
對話流程管理

當功能越來越多時,這種分層方式就變得非常重要。

如果把所有程式都放在 Controller 裡面,後面真的會越來越難維護。


七、Repository 負責資料庫操作

例如:

@Repository
public class WaterRepository {
    // Database operations
}

Repository 主要負責:

INSERT
SELECT
UPDATE
DELETE

這次我們使用 Spring JDBC 操作 H2 Database。

雖然沒有使用比較進階的 ORM 框架,但透過 JDBC,我反而更清楚 SQL 是怎麼和 Java 程式連接的。


八、AIService 負責呼叫外部 AI API

我們在 Day 22 建立了:

AIService

使用 Java 17 的:

HttpClient

發送 HTTP Request。

整個流程是:

Java 建立 Request
       ↓
JSON 序列化
       ↓
HTTP POST
       ↓
OpenAI API
       ↓
取得 JSON Response
       ↓
解析 AI 文字
       ↓
回傳給 Service

這裡讓我印象最深刻的是:

AI API 其實也是一種 HTTP API。

原本覺得 AI 好像是一個很特別、很複雜的東西。

但真正開始串接後,發現它仍然需要理解:

HTTP
JSON
Request
Response
Status Code

這些之前學過的基礎觀念。


Part 4|最後一次完整功能測試

九、為什麼最後一天要做整合測試?

前面每一天,我們都有使用 Postman 測試當天建立的 API。

但單獨測試成功,不代表所有功能整合後一定沒有問題。

例如:

飲水 API 可以正常使用

不代表:

每日健康摘要一定能正確取得飲水資料

同樣地:

AI 聊天 API 可以正常使用

也不代表:

前端一定能正確顯示 AI 回答

所以最後一天,我希望從使用者的角度,重新檢查整個系統。

以下是一份可以實際執行的測試清單。


十、測試前準備

先確認:

  1. Java 17 或專案設定的相容版本已安裝。
  2. Spring Boot 專案可以正常編譯。
  3. H2 Database 設定正確。
  4. OPENAI_API_KEY 已設定。
  5. OpenAI API 帳戶有可用額度。
  6. 網路可以連接外部 AI API。
  7. Spring Boot 已啟動。

啟動指令:

./mvnw spring-boot:run

Windows:

.\mvnw.cmd spring-boot:run

接著打開:

http://localhost:8080/

確認網頁可以正常顯示。


十一、完整 API 測試清單

測試項目 API 預期結果
BMI 計算 POST /health/bmi 正確計算 BMI
BMI 輸入驗證 POST /health/bmi 拒絕不合理數值
新增飲水紀錄 POST /health/water 成功保存資料
查詢飲水紀錄 GET /health/water 回傳已保存資料
查詢指定日期飲水量 GET /health/water/date 正確計算總量
飲水歷史 GET /health/water/history 回傳歷史統計
飲水統計 GET /health/water/statistics 回傳七天統計
新增睡眠紀錄 POST /health/sleep 成功保存資料
查詢睡眠紀錄 GET /health/sleep 回傳指定日期資料
睡眠統計 GET /health/sleep/statistics 回傳七天統計
每日健康摘要 GET /health/summary 整合飲水與睡眠
AI API 測試 GET /health/ai/test 回傳 AI 文字
AI 每日摘要 GET /health/ai/summary 回傳自然語言摘要
AI 健康問答 POST /health/ai/ask 回答一般健康問題
AI 多輪對話 POST /health/ai/conversation 保留對話上下文
歷史對話列表 GET /health/ai/conversations 回傳對話清單
指定對話查詢 GET /health/ai/conversations/{id} 回傳完整訊息
刪除對話 DELETE /health/ai/conversations/{id} 刪除指定對話

這張表也可以作為最後的驗收清單。


十二、測試案例一:健康資料是否正確保存?

首先使用 Postman 新增飲水紀錄。

POST http://localhost:8080/health/water

Request Body:

{
  "amount": 500
}

再新增另一筆:

{
  "amount": 300
}

如果兩筆紀錄屬於同一天,當天總飲水量應該增加:

500 + 300 = 800 ml

接著查詢當天的飲水資料。

確認:

總量是否正確
資料是否保存
重新啟動後是否仍然存在

最後一點特別重要。

因為我們在 Day 13 最初使用記憶體保存飲水紀錄。

當時只要重新啟動程式,資料就會消失。

後來改成 H2 File Database,才讓紀錄可以持續保存。


十三、測試案例二:每日健康摘要是否正確?

接著準備指定日期的飲水與睡眠紀錄。

例如:

日期:2026-10-17

飲水量:1500 ml

睡眠時間:7.5 小時

呼叫:

GET http://localhost:8080/health/summary?date=2026-10-17

預期回傳:

{
  "date": "2026-10-17",
  "water": {
    "totalWater": 1500,
    "unit": "ml",
    "hasRecord": true
  },
  "sleep": {
    "totalHours": 7.5,
    "unit": "hours",
    "hasRecord": true
  }
}

這裡要檢查的不只是數字。

還要確認:

日期正確
單位正確
hasRecord 正確

尤其是沒有紀錄的情況。

如果當天沒有睡眠資料,應該顯示:

{
  "totalHours": 0.0,
  "unit": "hours",
  "hasRecord": false
}

這代表系統沒有紀錄,不代表使用者真的睡了零小時。


十四、測試案例三:AI 是否正確使用健康資料?

接著測試:

GET http://localhost:8080/health/ai/summary?date=2026-10-17

如果資料庫裡面有:

飲水量:1500 ml
睡眠時間:7.5 小時

AI 產生的摘要就應該以這些數值為基礎。

例如:

今天已記錄飲水量 1500 ml,
睡眠時間 7.5 小時。

但如果 AI 回答:

今天喝了 2500 ml 的水。

就代表 AI 產生了與資料不一致的內容。

這種情況就是我們之前提到的:

AI Hallucination(幻覺)

因此在測試時,不能只確認 AI 有回傳文字。

還需要檢查:

數值是否正確
有沒有編造資料
沒有紀錄時是否正確說明
有沒有提供不適當的醫療判斷

另外也要注意:

Prompt 雖然可以限制模型行為,但不能保證完全不會出錯。

如果未來真的要公開使用,還需要加入輸出驗證與更完整的安全機制。


十五、測試案例四:AI 是否能理解多輪對話?

首先發送:

POST http://localhost:8080/health/ai/conversation

Request Body:

{
  "question": "什麼是 BMI?"
}

假設回傳:

{
  "conversationId": "550e8400-e29b-41d4-a716-446655440000",
  "answer": "BMI 是身體質量指數。"
}

接著發送第二個問題:

{
  "conversationId": "550e8400-e29b-41d4-a716-446655440000",
  "question": "那它怎麼計算?"
}

如果 AI 能理解:

它

指的是:

BMI

就代表多輪對話功能有發揮作用。

不過這裡也需要注意,AI 對話不是每次都會產生完全相同的回答。

因此測試重點應該放在:

回答是否理解前後文,而不是文字是否一模一樣。


十六、測試案例五:網頁是否能正常操作?

最後打開:

http://localhost:8080/

依序測試:

操作 預期結果
開啟網頁 正常顯示智慧健康助理
選擇日期 日期欄位正常更新
查詢健康紀錄 顯示飲水與睡眠資料
點擊 AI 摘要 顯示 AI 產生的摘要
輸入聊天問題 顯示使用者訊息
等待 AI 回答 顯示等待提示
收到 AI 回答 顯示 AI 訊息
連續提問 保留同一段對話
點擊新對話 開始新的對話
查看歷史對話 顯示已保存的對話
點擊舊對話 恢復歷史訊息
接續舊對話 使用原本的 conversationId
重新整理網頁 仍可查詢歷史對話

如果以上測試都能通過,就代表主要功能已經可以完成整合操作。

當然,這只是基本的手動測試。

並不代表整個系統已經通過正式環境所需要的安全性、效能與可靠性測試。


Part 5|這 30 天遇到的問題

十七、問題一:一開始不太理解 Spring Boot 的分層架構

在最初建立 API 時,我其實很想把所有程式都放在 Controller 裡面。

因為感覺這樣比較直接。

例如:

接收參數
    ↓
計算 BMI
    ↓
回傳結果

全部放在同一個 Method 裡,好像也能正常執行。

但當後面開始加入:

飲水紀錄
睡眠紀錄
資料庫
AI

就發現這樣很容易讓程式變得混亂。

所以後來開始學習:

Controller
Service
Repository
DTO

的分工。

這讓我慢慢理解:

程式可以執行,和程式容易維護,是兩件不同的事情。


十八、問題二:資料庫比想像中更需要規劃

一開始我以為保存資料很簡單。

只要使用:

List

或:

Map

就可以把資料存起來。

但後來發現,只要重新啟動程式,這些資料就會消失。

所以才開始學習 H2 Database。

接著又遇到:

資料表怎麼建立?
SQL 要怎麼寫?
Java 怎麼執行 SQL?
日期欄位要怎麼處理?
查不到資料時要回傳什麼?

這些問題。

尤其是:

沒有紀錄

和:

數值為零

之間的差異,是我以前比較沒有注意到的地方。

但對健康紀錄系統來說,這個差異其實很重要。


十九、問題三:AI 串接不只是把問題送出去

在 Day 21 開始研究生成式 AI API 時,我原本以為只要:

Java → AI API

就可以完成智慧健康助理。

但後來發現,真正需要思考的事情很多。

例如:

Prompt 要怎麼設計?
API Key 要怎麼保存?
AI 回覆的 JSON 要怎麼解析?
如果 API 發生錯誤怎麼辦?
AI 如果編造健康資料怎麼辦?
怎麼讓 AI 記得之前的對話?

其中最重要的收穫是:

AI 不應該取代原本可以由程式確定完成的工作。

例如:

BMI 計算
飲水總量
睡眠平均時數

這些都應該由 Java 負責。

而 AI 比較適合處理:

自然語言摘要
一般健康知識問答
對話式互動

這樣可以讓整個系統的責任分工更清楚。


二十、問題四:前端和後端串接時,要注意資料格式

到了 Day 28 開始寫網頁時,又遇到另一個新的挑戰。

之前使用 Postman 時,可以直接看到 JSON。

但到了 JavaScript,就需要自己處理:

fetch()
JSON.stringify()
response.json()

以及:

async
await

尤其是當 API 回傳格式和 JavaScript 預期不同時,畫面可能就無法正常顯示。

例如後端回傳:

{
  "answer": "你好!"
}

但前端卻寫:

data.message

就會取得:

undefined

所以這次也讓我更理解:

前後端必須先約定好資料格式,才能順利合作。


Part 6|目前系統還有哪些限制?

二十一、這個專案仍然是學習用原型

雖然這 30 天完成了不少功能,但我覺得還是要清楚說明目前系統的限制。

因為:

可以在本機執行,不代表已經適合公開提供服務。

目前最主要的限制有以下幾個。

1. 尚未加入使用者登入

目前專案主要以單人使用情境設計。

還沒有:

使用者註冊
登入驗證
使用者資料隔離

所以不能直接拿來當成多人使用的健康紀錄平台。

尤其是聊天紀錄可能包含個人健康資訊,更需要做好權限管理。

2. 尚未建立完整的隱私保護機制

健康紀錄可能涉及敏感資訊。

如果未來要公開使用,需要考慮:

個人資料保護
資料保存期限
資料刪除
傳輸加密
第三方 AI 服務的資料處理方式

不能只因為系統可以正常執行,就忽略這些問題。

3. AI 回覆仍然可能不正確

即使已經設計 Prompt,AI 仍然可能產生:

不精確的說明
不完整的回答
不存在的資訊

因此這個系統目前只能提供一般健康知識與紀錄整理。

不能作為疾病診斷或治療決策工具。

4. 尚未加入完整的自動化測試

目前主要使用:

Postman

以及:

瀏覽器

進行手動測試。

未來可以學習:

JUnit
Mockito
Spring Boot Test

建立自動化測試。

這樣未來修改程式時,才能更容易確認舊功能沒有受到影響。

5. 尚未正式部署

目前專案主要在:

localhost:8080

執行。

還沒有處理正式部署需要的:

HTTPS
正式資料庫
環境變數管理
日誌監控
API 使用量限制
備份與還原

所以這次的成果比較適合定位為:

智慧健康助理的本機展示原型。


Part 7|如果繼續開發,還想加入什麼?

二十二、未來功能規劃

雖然 30 天挑戰要結束了,但我覺得這個專案還有很多可以繼續延伸的方向。

如果未來有時間,我最想加入以下幾個功能。

1. 直接在網頁新增健康紀錄

目前網頁可以查詢健康摘要,但還沒有完整的資料輸入表單。

未來希望使用者可以直接輸入:

今天喝了 300 ml 的水

或:

昨晚睡了 7.5 小時

不需要再使用 Postman。

2. 健康資料圖表

目前的統計結果主要以 JSON 和文字呈現。

未來可以使用:

Chart.js

將飲水與睡眠資料畫成圖表。

例如:

最近七天飲水量折線圖
最近七天睡眠時數長條圖

這樣使用者可以更直覺地觀察自己的紀錄變化。

3. 使用者登入系統

未來希望加入:

Spring Security

讓不同使用者擁有自己的帳號。

每個人只能查看自己的健康資料和聊天紀錄。

這會是讓專案從單人練習走向多人使用的重要一步。

4. 更完整的 AI 健康紀錄問答

目前 AI 可以整理指定日期的健康摘要,也能回答一般健康問題。

未來希望可以詢問:

我最近一週的飲水紀錄有什麼變化?

或:

幫我整理這個月的睡眠紀錄。

這時候就需要讓 Java 先查詢指定期間的資料,再把整理後的結果提供給 AI。

而不是讓 AI 自己猜測。

5. 正式部署

最後希望有機會把專案部署到雲端。

讓它不只能在自己的電腦上使用,也能透過網址開啟。

不過在公開部署之前,必須先完成身分驗證、資料保護和 API 使用限制等安全措施。


Part 8|這 30 天最大的學習收穫

二十三、收穫一:開始理解一個系統是怎麼組成的

以前學習程式語言時,常常是完成一個個小練習。

例如:

計算 BMI
使用迴圈
建立 Class

雖然這些都是重要的基礎,但我比較難想像它們最後可以怎麼組合成一個完整的應用程式。

這次透過 Spring Boot 專案,我開始理解:

使用者輸入
       ↓
前端
       ↓
API
       ↓
後端邏輯
       ↓
資料庫
       ↓
回傳結果

這整個流程。

也開始知道當某個功能發生問題時,應該從哪個部分檢查。


二十四、收穫二:學會將大問題拆成小問題

如果 Day 1 就直接要求自己:

「做出一個有資料庫、有 AI、有網頁的智慧健康助理。」

我大概會完全不知道從哪裡開始。

但這次把目標拆成:

先建立 Spring Boot

接著:

先完成一支 API

再來:

加入資料庫

最後:

串接 AI 與前端

整個過程就變得比較容易理解。

每一天只要完成一個小目標,就能慢慢累積成最後的成果。

這也是我覺得 30 天挑戰很有價值的地方。


二十五、收穫三:開始知道 AI 應該放在系統的哪個位置

在這次專案之前,我對 AI 的想像比較接近:

使用者問問題
       ↓
AI 回答

但現在我開始理解,AI 其實可以只是整個系統中的其中一個服務。

例如:

Java 查詢資料
       ↓
Java 計算統計
       ↓
Java 建立 Prompt
       ↓
AI 產生自然語言
       ↓
Java 回傳結果

這樣的設計,讓 AI 不需要負責所有事情。

而是讓 Java 處理確定性的資料運算,再讓 AI 負責比較擅長的文字整理。

我覺得這是整個系列最重要的觀念之一。


二十六、收穫四:錯誤處理和資料驗證真的很重要

一開始寫 API 時,只要看到:

200 OK

就會覺得很開心。

但後來發現,真正需要注意的事情不只是成功的情況。

還包括:

使用者輸入負數怎麼辦?
沒有輸入日期怎麼辦?
資料庫沒有紀錄怎麼辦?
AI API 失敗怎麼辦?
使用者重複點擊按鈕怎麼辦?

這些問題都會影響系統的使用體驗。

所以我也開始理解,寫程式不只是完成正常流程,更需要思考異常情況。


二十七、收穫五:完成專案比想像中更有成就感

這 30 天裡面,有些內容真的花了不少時間理解。

尤其是:

Spring Boot 分層
JDBC
AI API
多輪對話
JavaScript Fetch

這幾個部分。

有時候只是少了一個參數,或是前後端欄位名稱不一致,就可能讓整個功能無法正常運作。

但當問題解決,重新測試成功時,又會覺得非常有成就感。

尤其是 Day 28 第一次在瀏覽器看到 AI 回答的時候。

那個感覺和單純在 Postman 看到 JSON,真的不太一樣。

因為終於有一種:

「原來我真的可以把學過的東西做成一個應用程式!」

的感覺。


Part 9|給未來自己的話

二十八、30 天結束,不代表學習結束

這次的鐵人賽雖然完成了,但我知道自己還有很多地方需要繼續學習。

例如:

Spring Security
JUnit
Docker
正式資料庫
雲端部署

以及更完整的 AI 應用設計。

不過和 Day 1 相比,現在至少已經知道這些技術大概會出現在系統的哪個位置,以及為什麼需要它們。

我覺得這就是這 30 天最大的進步。

以前看到一個完整的網站或應用程式,常常只會覺得:

「哇,這到底是怎麼做出來的?」

現在雖然還沒有辦法做出非常複雜的系統,但至少開始能夠想像:

它可能有哪些 API?
資料會存在哪裡?
前端怎麼和後端溝通?
AI 又是怎麼被整合進去的?

這種思考方式的改變,我覺得比單純記住某個語法還重要。


Part 10|最終成果總整理

二十九、智慧健康助理完成了!

最後再用一張表格,整理這次專案的主要技術。

項目 使用技術
程式語言 Java 17
後端框架 Spring Boot
專案管理 Maven
API 設計 REST API
資料格式 JSON
資料驗證 Jakarta Validation
資料庫 H2 Database
資料庫操作 Spring JDBC
外部 API 呼叫 Java HttpClient
AI 服務 OpenAI API
前端結構 HTML
前端樣式 CSS
前端互動 JavaScript
前後端溝通 Fetch API
API 測試 Postman
開發環境 IDE、瀏覽器

整個系統目前包含:

Java × AI 智慧健康助理
│
├── 1. 健康計算
│   └── BMI 計算與分類
│
├── 2. 健康紀錄
│   ├── 飲水紀錄
│   ├── 飲水統計
│   ├── 睡眠紀錄
│   └── 睡眠統計
│
├── 3. 健康摘要
│   ├── 每日健康資料整合
│   └── AI 每日健康文字摘要
│
├── 4. AI 聊天
│   ├── 一般健康知識問答
│   ├── 多輪對話
│   ├── 對話紀錄保存
│   └── 歷史對話管理
│
├── 5. 資料庫
│   ├── 飲水資料
│   ├── 睡眠資料
│   └── 聊天資料
│
└── 6. 網頁介面
    ├── 每日健康摘要
    ├── AI 摘要產生
    ├── AI 聊天視窗
    └── 歷史對話查詢

雖然這還不是一個可以正式上線的完整產品,但它已經包含一個基本 Web 應用程式需要的主要元素:

前端、後端、資料庫、API,以及 AI 服務整合。

這也是這次 30 天挑戰最終想完成的目標。


Day 30 小結|30 天挑戰正式完賽!

終於完成 30 天了!

從最初的:

System.out.println("Hello World!");

到最後:

使用者
   ↓
網頁
   ↓
Spring Boot
   ↓
資料庫與 AI
   ↓
健康摘要與聊天回覆

這一路學習了很多以前不熟悉的技術。

也慢慢理解,一個應用程式並不是只靠某一種程式語言就能完成。

而是需要將不同技術整合在一起,讓每個部分各自完成適合的工作。

這 30 天最大的收穫,不只是學會了 Spring Boot、JDBC 或 AI API。

而是開始建立一種開發專案的思考方式。

遇到問題時,先確認需求。

接著拆解功能。

再思考需要哪些資料、API 和程式邏輯。

最後透過測試,一步一步確認功能是否正確。

如果要用一句話總結這次的挑戰,我會選擇:

從一個小小的 API 開始,每天完成一點點,最後真的能把想法變成一個看得見、也能操作的作品。

這個智慧健康助理還有很多可以改善的地方。

但至少對現在的我來說,它已經不只是課本上的範例,而是一個從規劃、開發到整合,自己一步一步學習完成的專案。

也希望未來回頭看這 30 篇文章時,能夠記得自己是怎麼從不熟悉 Java 後端開發,慢慢學會建立 API、操作資料庫,以及串接 AI。

最後,謝謝這 30 天願意一起閱讀的大家!

如果你也是剛開始學習 Java、Spring Boot 或 AI API,希望這個系列能夠提供一些入門方向。

不一定要一開始就做出很厲害的系統。

先從一支簡單的 API 開始,也許就是很好的第一步。


上一篇
打造智慧健康助理完整網頁
系列文
Java × AI:30天打造智慧健康助理 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言